package com.evil.application.pojo.dto.order;

import com.evil.common.activiti.enums.HandleTypeEnum;
import com.evil.common.application.dto.process.node.NodeHandlerDTO;
import lombok.Data;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 订单列表 基础请求实体
 *
 * @author liyang
 * @date 2022-08-08 00:00
 */
@Data
public class OrderBaseReqDTO {

    /**
     * 企业id
     */
    private Long enterpriseId;

    /**
     * 应用key
     */
    @NotBlank(message = "应用key参数不能为空")
    private String applicationKey;

    /**
     * 应用id
     */
    private Long applicationId;

    /**
     * 查询类型（0：我的待办，1：已办事项，2：抄送事项，3：我发起的，4：全部数据）
     */
    @NotNull(message = "查询类型不能为空")
    private Integer queryType;

    /**
     * 流程状态(0:草稿箱, 1:流程中, 2:已完成)
     */
    private Integer processStatus;

    /**
     * 流程状态(0:草稿箱, 1:流程中, 2:已完成)
     */
    private Integer notEqProcessStatus;

    /**
     * 流程状态(0:草稿箱, 1:流程中, 2:已完成)
     */
    private List<Integer> inProcessStatus;

    /**
     * 发起人
     */
    private Long creatorId;

    /**
     * 节点处理人（或 处理）
     */
    @Valid
    private List<NodeHandlerDTO> nodeHandlers;

    public OrderBaseReqDTO() {
        this.nodeHandlers = new ArrayList<>();
    }

    /**
     * 多人同种处理
     *
     * @param handleTypeEnum handleTypeEnum
     * @param handlerIds     handlerIds
     */
    public void addNodeHandlers(HandleTypeEnum handleTypeEnum, Long... handlerIds) {
        this.nodeHandlers.addAll(Arrays.stream(handlerIds).map(e -> new NodeHandlerDTO(e, handleTypeEnum.getId())).collect(Collectors.toList()));
    }

    /**
     * 同人多种处理
     *
     * @param handlerId   handlerId
     * @param handleTypes handleTypes
     */
    public void addNodeHandlers(Long handlerId, Integer... handleTypes) {
        this.addNodeHandlers(handlerId, Arrays.asList(handleTypes));
    }

    /**
     * 同人多种处理
     *
     * @param handlerId   handlerId
     * @param handleTypes handleTypes
     */
    public void addNodeHandlers(Long handlerId, List<Integer> handleTypes) {
        this.nodeHandlers.addAll(handleTypes.stream().map(e -> new NodeHandlerDTO(handlerId, e)).collect(Collectors.toList()));
    }
}
